﻿/*
 * canttchartview.cpp
 * 甘特图视图实现文件
 * 实现CanttChartView类的成员函数，负责初始化视图、处理用户交互和转发场景操作
 */
#include "canttchartview.h"
#include "canttchartscene.h"

#include <QWheelEvent>

/**
 * @brief CanttChartView类的构造函数
 * @param parent 父窗口指针
 * @details 初始化甘特图视图，创建场景，设置对齐方式、拖动模式和渲染提示
 */
CanttChartView::CanttChartView(QWidget *parent) : QGraphicsView(parent)
{
    // 创建甘特图场景
    m_pScene = new CanttChartScene(this);
    setScene(m_pScene);

    // 设置对齐方式为左上对齐
    setAlignment(Qt::AlignLeft | Qt::AlignTop);
    // 设置拖动模式为手形拖动
    setDragMode(QGraphicsView::ScrollHandDrag);
    // 设置渲染提示为抗锯齿和文本抗锯齿
    setRenderHints(QPainter::Antialiasing | QPainter::TextAntialiasing);

    // 居中显示在(0,0)点
    centerOn(0, 0);
}

/**
 * @brief 设置时间轴范围
 * @param start 开始时间
 * @param end 结束时间
 * @param platforms 平台列表
 * @details 转发设置时间轴范围的请求给场景
 */
void CanttChartView::setAxisRange(const QDateTime &start, const QDateTime &end, const QStringList &platforms)
{
    m_pScene->setAxisRange(start, end, platforms);
}

/**
 * @brief 添加计划时间条
 * @param platform 平台名称
 * @param start 开始时间
 * @param end 结束时间
 * @return 返回创建的时间条项
 * @details 转发添加计划时间条的请求给场景
 */
CanttTimeBarItem *CanttChartView::addPlanTimeBar(const QString &platform, const QDateTime &start, const QDateTime &end)
{
    return m_pScene->addPlanTimeBar(platform, start, end);
}

/**
 * @brief 添加实际时间条
 * @param platform 平台名称
 * @param start 开始时间
 * @param end 结束时间
 * @return 返回创建的时间条项
 * @details 转发添加实际时间条的请求给场景
 */
CanttTimeBarItem *CanttChartView::addRealTimeBar(const QString &platform, const QDateTime &start, const QDateTime &end)
{
    return m_pScene->addRealTimeBar(platform, start, end);
}

/**
 * @brief 设置时间步长值
 * @param time 时间步长
 * @details 转发设置时间步长值的请求给场景
 */
void CanttChartView::setStepTimeValue(const QTime &time)
{
    m_pScene->setStepTimeValue(time);
}

/**
 * @brief 重写鼠标滚轮事件，处理缩放
 * @param event 滚轮事件
 * @details 根据滚轮方向调用放大或缩小函数
 */
void CanttChartView::wheelEvent(QWheelEvent *event)
{
    if (event->delta() > 0)
    {
        zoomOut();
    }
    else
    {
        zoomIn();
    };
}

/**
 * @brief 放大视图
 * @details 调用scaleBy函数，以1.1倍放大视图
 */
void CanttChartView::zoomIn()
{
    scaleBy(1.1);
}

/**
 * @brief 缩小视图
 * @details 调用scaleBy函数，以1/1.1倍缩小视图
 */
void CanttChartView::zoomOut()
{
    scaleBy(1.0 / 1.1);
}

/**
 * @brief 按比例缩放视图
 * @param factor 缩放因子
 * @details 调用QGraphicsView的scale函数进行缩放
 */
void CanttChartView::scaleBy(double factor)
{
    scale(factor, factor);
}
